package com.learn.singleton005;

/**
 * 静态内部类-线程安全
 * @author 1
 */
public class SingleInnerStaticSafe {

    /**
     * 小明： 静态实例对象，并且具有可见性。
     * 老王： 嗯嗯
     */
    private static volatile SingleInnerStaticSafe singleInnerStaticSafe;

    /**
     * 小明： 构造函数私有化，外部不可以new对象。
     * 老王： 嗯嗯
     */
    private SingleInnerStaticSafe(){

    }

    /**
     * 小明： 静态内部类，具有一个静态属性，也就是我们要的实例对象。
     * 老王： 嗯嗯，这个类加载的时候不会实例化，只有调用的时候才会实例化。不会造成内存浪费。
     * 小明： 是JVM帮助我们保证了线程的安全性，在类初始化的时候，别的线程是无法进入的。
     */
    private static class SingletonInstance{
        private static final SingleInnerStaticSafe INSTANCE = new SingleInnerStaticSafe();
    }

    /**
     * 小明： 提供静态公有方法，直接返回静态内部类的实例对象。
     * 老王： 不错哦。
     * @return
     */
    public static SingleInnerStaticSafe getInstance(){
        return SingletonInstance.INSTANCE;
    }
}
